define(["jquery","comm/form/form.attention","comm/form/form.validate"],function($,$attention,$validate){
	var quest = {};

	/**
	 * 数据处理
	 */
    quest.formatData = function(obj){
    	if( obj.list && $.isArray(obj.list) && obj.list.length > 0 ){
    		for(var i = 0; i < obj.list.length; i++){
    			if( typeof obj.list[i] == "string" ){
    				var str = obj.list[i];
    				obj.list[i] = {};
    				obj.list[i].key = str;
    				obj.list[i].text = str;
    			}
    			obj.list[i].clickable = true;     	// 选项可以点击
    		}
    		obj.listStr = JSON.stringify(obj.list);
    		if( !obj.row ) obj.row = 3;
    		var n = obj.row; // 一行n列
    		obj.width = (100 / n) + "%";
    		if(obj.list.length % n != 0){
                var num = n - obj.list.length % n;
                var nullObj = {
                    "key":"",
                    "text":"",
                    "clickable":false,   			// 空选项不可以点击
                }
                for (var j = 0; j < num; j++) {
                    obj.list.push(nullObj);
                }
            }
    	}
		return obj;
	}

	/**
	 * tpl模板
	 */
	quest.tpl = function(){
		return 	'<script id="tpl_question_sudoku" type="text-html">'+
				'	<div {{if relationId}}relationId="{{relationId}}"{{/if}} class="qaCard-sudoku qaCard form-group form-group-sm col-sm-{{length}} col-md-{{length}} grid-label-{{labelLength}}">'+
				'		<label class="control-label {{align}}">{{label}}</label>'+
				'   	<div class="control-input">'+
				'			<div class="sudoku" data-listStr="{{listStr}}">'+
				'				{{if status=="default"}}'+
				'					<div class="sudoku-input">'+
				'						<input type="text" class="form-control validatebox" name="{{name}}" data-type="{{type}}" data-quesId="{{id}}" data-innDeCode="{{innDeCode}}" data-deCode="{{deCode}}" data-dataUnit="{{dataUnit}}" data-validate="{{validate}}" data-attention="{{attention}}" placeholder="{{placeHolder}}">'+
				'						<i class="fa fa-caret-down sudoku-dropdown-toggle clickable"></i>'+
				'					</div>'+
				'				{{else if status=="readonly"}}'+
				'					<div class="sudoku-input">'+
				'						<p class="form-control-static validatebox" name="{{name}}" data-type="{{type}}" data-quesId="{{id}}" data-innDeCode="{{innDeCode}}" data-deCode="{{deCode}}" data-dataUnit="{{dataUnit}}" data-validate="{{validate}}" data-attention="{{attention}}"></p>'+
				'						<i class="fa fa-caret-down sudoku-dropdown-toggle readonly"></i>'+
				'					</div>'+
				'				{{else if status=="disabled"}}'+
				'					<div class="sudoku-input">'+
				'						<input type="text" class="form-control validatebox" name="{{name}}" data-type="{{type}}" data-quesId="{{id}}" data-innDeCode="{{innDeCode}}" data-deCode="{{deCode}}" data-dataUnit="{{dataUnit}}" data-validate="{{validate}}" data-attention="{{attention}}" placeholder="{{placeHolder}}" disabled>'+
				'						<i class="fa fa-caret-down sudoku-dropdown-toggle"></i>'+
				'					</div>'+
				'				{{/if}}'+
				'				<ul class="sudoku-dropdown">'+
				'					{{each list as item i}}'+
				'						<li class="{{if item.clickable}}clickable{{/if}}" data-key="{{item.key}}" style="width:{{width}}">{{item.text}}</li>'+
				'					{{/each}}'+
				'				</ul>'+
				'			</div>'+
				'		</div>'+
				'	</div>'+
				'</script>';
	}

	/**
	 * 处理value
	 */
	var handleVal = function($dom,value){
		if( value || value == "" ){
			var list = JSON.parse( $dom.parent().parent().attr("data-listStr") );
			for (var i = 0; i < list.length; i++) {
				if( list[i].key == value ){
					value = list[i].text;
					break;
				}
			}
			if( $dom.hasClass("form-control-static") ){
				$dom.html(value);
			}else{
				$dom.val(value);
				$dom.trigger('input');
			}
		}
	}

	/**
	 * 赋值
	 */
	quest.setValue = function($dom,value){
		if( value ){
			handleVal($dom,value.quesValue);
		}
	}

	/**
	 * 获取value（保存时，获取每个dom对应的答案）
	 */
	quest.getValue = function($dom,name){
		var val;
		var text = $dom.hasClass("form-control-static") ? $dom.html() : $dom.val();
		var list = JSON.parse( $dom.parent().parent().attr("data-listStr") );
		for (var i = 0; i < list.length; i++) {
			if( list[i].text == text ){
				val = list[i].key;
				break;
			}
		}
		var value = {};
		value.quesValue = val;
		value.quesId = $dom.attr("data-quesId");
		value.deCode = $dom.attr("data-deCode");
		value.innDeCode = $dom.attr("data-innDeCode");
		var dataUnit = $dom.attr("data-dataUnit");
		if( dataUnit ) value.dataUnit = dataUnit;
		return value;
	}

	/**
	 * 事件(若没有事件函数，可以不写)
	 */
	quest.event = function(eventParams){
		// 值改变时，触发
		$(".qaCard-sudoku .sudoku input").bind("input propertychange",function(){
			var value = $(this).val();
			var oLi = $(this).parent().next().find("li.clickable");
			oLi.each(function(i){
				if( oLi.eq(i).html() == value ){
					oLi.eq(i).addClass("active");
				}else{
					oLi.eq(i).removeClass("active");
				}
			});
		});
		// 选项显示与隐藏
		$(document).click(function(){
			$(".qaCard-sudoku .sudoku .sudoku-dropdown").hide();
		});
		$(".qaCard-sudoku .sudoku .sudoku-dropdown-toggle.clickable").click(function(e){
			e.stopPropagation();
			var This = this;
			$(This).parent().next().toggle();
			$(This).parent().next().find("li").click(function(e){
				e.stopPropagation();
			});
			$(This).parent().next().find("li.clickable").click(function(){
				$(this).addClass("active").siblings().removeClass("active");
				var value = $(this).html();
				$(This).prev().val(value).blur();
				$(This).parent().next().hide();
			});
		});
	}

	/**
	 * 提醒
	 */
	quest.attention = function(id){
        $("#" + id + " .qaCard-sudoku .validatebox").bind("blur input propertychange",onAttention);
        // 初始化
        $("#" + id + " .qaCard-sudoku .validatebox").blur();
	}

	/**
	 * 校验
	 * flag:
	 * 	 true:  (点击保存按钮时使用)
	 * 	 false: 
	 */
	quest.validate = function(id,flag){
        $("#" + id + " .qaCard-sudoku .validatebox").bind("blur",onValidate);
        if( flag ){
        	var result = true;
        	$("#" + id + " .qaCard-sudoku .validatebox").each(function(i){
        		var params = {
		            "value":getValue($(this)),
		            "dom":$(this),
		            "flag":flag,
		        };
				var success = $validate.init(params,handleByRuleValidate,handleBytypeValidate);
	            result = result && success;
	            if( !result ) return result;
	    	});
        	return result;
        }
	}

	/**
	 * 获取输入的值(validate、attention中需要用到)
	 */
	var getValue = function($dom){
		var value = $dom.hasClass("form-control-static") ? $dom.html() : $dom.val();
		return value.trim();
	}

	/********************  attention begin  ********************/

	/**
	 * xx情况下触发的事件 (有可能是失去焦点等)
	 */
	var onAttention = function(){
		var params = {
            "value":getValue($(this)),
            "dom":$(this),
        };
		$attention.init(params,handleByRule,handleBytype);
    }

    /**
     * 根据单个规则rule获取单个规则的结果result
     * 该题型已有规则在case里拦截，公用规则从default里返回结果
     * @return Boolean [布尔值]
     */
    var handleByRule = function(obj){
    	var result;
    	switch(obj.type) {
            default:
            	result = $attention.handleByRule(obj);
        }
        return result;
    }

    /**
     * 根据提醒类型(type)执行对应的方法
     * 该题型已有提醒类型在case里拦截，公用提醒类型在default里处理
     */
    var handleBytype = function(obj){
    	if( obj.type ){
    		switch(obj.type) {
	            default:
            		$attention.handleBytype(obj);
	        }
    	}
    }

    /********************  attention end  ********************/

    /********************  validate begin  ********************/

    /**
	 * xx情况下触发的事件 (有可能是失去焦点等)
	 */
	var onValidate = function(){
		var params = {
            "value":getValue($(this)),
            "dom":$(this),
        };
		$validate.init(params,handleByRuleValidate,handleBytypeValidate);
	}

	/**
     * 根据单个规则rule获取单个规则的结果result
     * 该题型已有规则在case里拦截，公用规则从default里返回结果
     * @return Boolean [布尔值]
     */
    var handleByRuleValidate = function(obj){
    	var result = true;
    	switch(obj.type) {
            default:
            	result = $validate.handleByRule(obj);
        }
        return result;
    }

    /**
     * 根据提醒类型(type)执行对应的方法
     * 该题型已有提醒类型在case里拦截，公用提醒类型在default里处理
     */
    var handleBytypeValidate = function(obj){
    	if( obj.type ){
    		switch(obj.type) {
	            default:
            		$validate.handleBytype(obj);
	        }
    	}
    }

	/********************  validate begin  ********************/
    
	return quest;
});